package zhongbo.java.air.ingestion.listener;

import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.connection.MessageListener;
import org.springframework.stereotype.Component;
import zhongbo.java.air.ingestion.dto.FlightPathDto;

import java.util.Date;

/**
 * 说明：
 *
 * @author 钟波dellNotebook
 * @since 2025年04月03日 星期四 10:46:50
 */
@Component
@Slf4j
public class RedisPathListener implements MessageListener {

    @Autowired
    private RedisPathPublisher redisPathPublisher;

    @Override
    public void onMessage(Message message, byte[] bytes) {
        log.info("收到航迹信息:" + message.toString());
        String jsonStr = message.toString();
        doConvert(jsonStr);
    }

    private void doConvert(String jsonStr) {
        JSONObject jsonObject = JSONUtil.parseObj(jsonStr);

        // 获取 Icao
        String icao = jsonObject.getStr("icao");

        // timestamp + trace[0]
        // 获取时间戳
        Double timestamp = jsonObject.getDouble("timestamp");
        JSONArray trace = jsonObject.getJSONArray("trace");
        Double offset = trace.getDouble(0);
        double finalTime = timestamp + offset;
        if (finalTime < 1000000000000D) {
            finalTime = finalTime * 1000;
        }
        Date time = new Date((long) finalTime);

        // trace[1]
        // 纬度（WGS84坐标系）
        Double lat = trace.getDouble(1);

        // trace[2]
        // 经度（WGS84坐标系）
        Double lon = trace.getDouble(2);

        // trace[3] 如果 为ground 则设置高度为0
        // 海拔高度（米）
        Integer alt = 0;
        Object altObj = trace.get(3);
        if (!"ground".equals(altObj)) {
            alt = trace.getInt(3);
        }

        // trace[4]
        // 地速（公里/小时）
        Double speed = trace.getDouble(4);

        // trace[5]
        //航向角（0-359度）
        Double heading = trace.getDouble(5);

        // trace[8] 里面的 type 字段
        // 数据源类型（不用枚举, 用字符串）
        String type = null;
        try {
            JSONObject jo = trace.getJSONObject(8);
            if (jo != null) {
                type = jo.getStr("type");
            }
        } catch (Exception e) {
            log.error("获取数据源类型type失败,error:", e);
        }


        FlightPathDto flightPathDto = new FlightPathDto();
        flightPathDto.setIcaoCode(icao);
        flightPathDto.setTimestamp(time);
        flightPathDto.setLatitude(lat);
        flightPathDto.setLongitude(lon);
        flightPathDto.setAltitude(alt);
        flightPathDto.setSpeed(speed);
        flightPathDto.setHeading(heading);
        flightPathDto.setSourceType(type);

        String toJsonStr = JSONUtil.toJsonStr(flightPathDto);
        redisPathPublisher.sendMessage(toJsonStr);


    }
}
